package main

import (
	"fmt"
	"sync"
	"time"
)

func f1() {
	fmt.Println("f1")
}
func f2() {
	fmt.Println("f2")
}
func f3() int64 {
	fmt.Println("f3")
	return time.Nanosecond.Nanoseconds()
}
func f4() (int64, error) {
	fmt.Println("f4")
	return time.Nanosecond.Nanoseconds(), nil
}
func main() {
	once := sync.Once{} //确保只会执行一次，就算换了目标也不会再执行
	once.Do(f1)
	once.Do(f2)
	fmt.Println("--------------")

	f1o := sync.OnceFunc(f1)
	f1o()
	f1o()
	f1o()
	fmt.Println("--------------")

	f3v := sync.OnceValue(f3)
	fmt.Println(f3v())
	fmt.Println(f3v())
	fmt.Println("--------------")

	f4v := sync.OnceValues(f4)

	for i := 0; i < 3; i++ {
		v, err := f4v()
		fmt.Println(v, err)
	}
	fmt.Println("--------------")

}
